package com.wyj.service.imp;

import com.wyj.service.LikeService;
import com.wyj.util.RedisKeyUtil;
import com.wyj.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

/**
 * @author 王永杰
 * @Description 描述该类的做什么用
 * @since 2022/7/26
 */
@Service
public class LikeServiceImp implements LikeService {

    @Autowired
    RedisUtil redisUtil;

    @Autowired
    RedisTemplate redisTemplate;

    @Override
    public void like(int userId, int entityType, int entityId,int entityUserId) {
        //某个用户 对 某个帖子 key值
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        //某个用户收到 赞数
        String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);

        //查看是否点赞 根据value值从一个set中进行查询 （该set 就是 一个集合 不仅仅是放userId）
        boolean b = redisUtil.sHasKey(entityLikeKey, userId);

        if (b) {//已经点赞
            redisUtil.setRemove(entityLikeKey,userId);
            //已经点赞的话 又点了一次 那么我们就减一
            redisUtil.decr(userLikeKey,1);
        } else {//未点赞
            redisUtil.sSet(entityLikeKey,userId);
            //某个用户收到的赞 增加1
            redisUtil.incr(userLikeKey,1);
        }
    }

    //这里的话求取的是某个帖子的获取的最大数量
    @Override
    public long findEntityLikeCount(int entityType, int entityId) {
        //这个是key值
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        // key: set()集合  那么我们就可以根据key值获取到set集合的大小就是我们点赞的数量
        return redisUtil.sGetSetSize(entityLikeKey);
    }

    @Override
    public int findEntityLikeStatus(int userId, int entityType, int entityId) {
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        //点赞是1 未点赞是0
        return redisUtil.sHasKey(entityLikeKey,userId) == true ? 1 : 0;
    }

    @Override
    public int findUserLikeCount(int userId) {
        String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);
        Integer count = (Integer) redisUtil.get(userLikeKey);

        return count == null ? 0 : count;
    }
}
